home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 10.3 KB | 285 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
- * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
- * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
- * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
- * Einverstndnisserklrung des Autors. *
- * *
- * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
- * fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
- * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
- * widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE mtXobjects;
-
- (*----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 1.00 | 02.02.92 | Hp | *
- * 1.01 | 09.02.92 | Hp | Handler verbessert. Macht jetzt auch *
- * | | | keine Probleme mehr bei Objekten in *
- * | | | der Menzeile. *
- *-----------+----------+------+----------------------------------------*)
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
- FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
- Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
- Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
- sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
- CastToChar, CastToByte, CastToByteset, CastToInt,
- CastToCard, CastToBitset, CastToWord, CastToLInt,
- CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
- TosVersion, Accessory, Basepage, SysHeader, TosDate;
-
-
-
-
-
-
-
-
- FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
-
-
-
- IMPORT SYSTEM, MagicAES;
-
- CONST Stacksize = 4096; (* 4kb Stack *)
-
- TYPE tTree = POINTER TO ARRAY [0..MAX (sINTEGER)] OF MagicAES.OBJECT;
-
- TYPE PtrUSERBLK = POINTER TO USERBLK; (* Intern erweitert! *)
- USERBLK = RECORD
- ubCode: PROC; (* Standard AES *)
- ubPara: MagicAES.Objcspec; (* Standard AES *)
- obType: sINTEGER; (* Magic Erweiterung *)
- draw: DrawProc; (* Magic Erweiterung *)
- priv: SYSTEM.ADDRESS; (* Magic Erweiterung *)
- END;
-
- TYPE PBLK = RECORD
- pbTree: tTree;
- pbObj: sINTEGER;
- prPrevstate: BITSET;
- prCurrstate: BITSET;
- pbX: sINTEGER;
- pbY: sINTEGER;
- pbW: sINTEGER;
- pbH: sINTEGER;
- pbXc: sINTEGER;
- pbYc: sINTEGER;
- pbWc: sINTEGER;
- pbHc: sINTEGER;
- pbParm: SYSTEM.ADDRESS;
- END;
-
- VAR pblkptr: SYSTEM.ADDRESS;
- pblk: PBLK;
- uPtr: PtrUSERBLK;
- return: sBITSET;
- regUSP: SYSTEM.LONGWORD;
- regSSP: SYSTEM.LONGWORD;
- regSR: SYSTEM.WORD;
- regs: ARRAY[0..15] OF SYSTEM.LONGWORD;
- stack: ARRAY [0..Stacksize-1] OF SYSTEM.BYTE;
- stackA7: SYSTEM.ADDRESS; (* Adresse des A7-Stacks *)
- stackA3: SYSTEM.ADDRESS; (* Adresse des A3-Stacks *)
- set: sBITSET;
-
-
- PROCEDURE Callproc;
- BEGIN
- (* Im obSpec steht der Zeiger auf den Userblock *)
- uPtr:= pblk.pbTree^[pblk.pbObj].obSpec.address;
- set:= uPtr^.draw (pblkptr);
- regs[0]:= SYSTEM.CAST (SYSTEM.LONGWORD, set);
- (* In regs[0] ist D0 gespeichert. Hier legen wir gleich unseren Return-
- * Parameter ab. Handler schreibt regs automatisch wieder zurck.
- *)
- END Callproc;
-
- (*$L- Parameterbergabe durch Assembler *)
- (*$J- Optimierungen aus (vorsichtshalber) *)
- (*$S- Kein Stackcheck! (Sonst bei Aufruf Stack-Error!) *)
- (*$R- Kein Rangecheck! (Sonst Bomben!) *)
-
- PROCEDURE Handler;
- (* Diese Prozedur wird direkt vom AES aufgerufen, schafft eine Modula-Umgebung,
- * und leitet den Aufruf an Callproc weiter. Callproc sucht dann den Userblk
- * fr das Objekt und ruft die Zeichenroutine auf, so als ob diese von einer
- * Modula-2 Prozedur gerufen wurde. Anschlieend werden die Rckgabe-Parameter
- * C-mig zusammengestellt und in das AES zurckgekehrt.
- *)
- BEGIN
- SYSTEM.ASSEMBLER
- MOVEM.L D0-D7/A0-A6,regs ; Register retten, damit wir beim Austritt aus
-
- MOVE SR,regSR ; Statusregister sichern
- ORI #$700,SR ; Interrupts sperren
-
- MOVE.L USP,A1 ; Handler wieder gleich dastehen
- MOVE.L A1,regUSP ; Userstackpointer
- MOVE.L A7, regSSP ; Supervisorstack
- MOVE regSR,SR ; Interrupts wieder freigeben
-
- MOVE.L 4(A7),A1 ; Hole Zeiger auf ParamBlock in A1
-
- LEA pblk, A0 ; Globalen Parameterblock in A0
-
- MOVE.L (A1)+,pblk.pbTree(A0) ; Parameterblock beschreiben
- MOVE.W (A1)+,pblk.pbObj(A0)
- MOVE.W (A1)+,pblk.prPrevstate(A0)
- MOVE.W (A1)+,pblk.prCurrstate(A0)
- MOVE.W (A1)+,pblk.pbX(A0)
- MOVE.W (A1)+,pblk.pbY(A0)
- MOVE.W (A1)+,pblk.pbW(A0)
- MOVE.W (A1)+,pblk.pbH(A0)
- MOVE.W (A1)+,pblk.pbXc(A0)
- MOVE.W (A1)+,pblk.pbYc(A0)
- MOVE.W (A1)+,pblk.pbWc(A0)
- MOVE.W (A1)+,pblk.pbHc(A0)
- MOVE.L (A1)+,pblk.pbParm(A0)
-
- ; ANDI.W #-1-$2000,SR ; Wechsle in den Usermode
-
- MOVE.L stackA3,A3 ; Stack fr -Parameter
- MOVE.L stackA7,A7 ; Prozessor-Stack
-
- JSR Callproc ; Caller aufrufen, Tunsdinge verrichten
-
- ; CLR.L -(A7) ; Zurck in Supervisormode
- ; MOVE #$20,-(A7) ; ber GEMDOS.Super
- ; TRAP #1
- ; ADDQ.L #6, A7
-
- ; Interrupts alle ausschalten
- MOVE SR,regSR ; Statusregister sichern
- ORI #$700,SR ; Interrupts sperren
-
- MOVE.L regSSP, A7 ; Register restaurieren
- MOVE.L regUSP,A1
- MOVE.L A1,USP
- MOVE regSR,SR ; Interrupts wieder freigeben
-
- MOVEM.L regs,D0-D7/A0-A6 ; Zurck ins AES
- END; (* ASSEMBLER *)
- END Handler;
- (*$L=, J=*)
-
-
- PROCEDURE InstUserdef (tree: SYSTEM.ADDRESS; objc: sINTEGER;
- proc: DrawProc; private: SYSTEM.ADDRESS): BOOLEAN;
- VAR uPtr: PtrUSERBLK;
- t: tTree;
- BEGIN
- t:= tree;
- IF t^[objc].obType # MagicAES.GPROGDEF THEN (* noch kein Progdef! *)
- (* Neuer Userblock fr das Objekt *)
- ALLOCATE (uPtr, SYSTEM.TSIZE (USERBLK));
- IF uPtr # NIL THEN
- (* Userblock beschreiben *)
- uPtr^.ubCode:= Handler; (* Handler eintragen *)
-
- uPtr^.ubPara:= t^[objc].obSpec; (* obSpec retten *)
- uPtr^.obType:= t^[objc].obType; (* obType retten *)
- uPtr^.draw:= proc; (* Die eigentliche Zeichenprozedur *)
- uPtr^.priv:= private; (* Zusatzparameter *)
- t^[objc].obType:= MagicAES.GPROGDEF; (* Objekttyp ndern *)
- t^[objc].obSpec.address:= uPtr; (* obSpec auf Userblock umbiegen *)
- RETURN TRUE;
- END;
- RETURN FALSE;
- END;
- RETURN TRUE;
- END InstUserdef;
-
- PROCEDURE FreeUserdef (tree: SYSTEM.ADDRESS; objc: sINTEGER);
- VAR uPtr: PtrUSERBLK;
- t: tTree;
- BEGIN
- t:= tree;
- IF t^[objc].obType = MagicAES.GPROGDEF THEN
- uPtr:= t^[objc].obSpec.address; (* Userblock holen *)
- t^[objc].obType:= uPtr^.obType; (* obType restaurieren *)
- t^[objc].obSpec:= uPtr^.ubPara; (* obSpec restaurieren *)
- DEALLOCATE (uPtr, 0);
- END;
- END FreeUserdef;
-
- PROCEDURE GetObtype (tree: SYSTEM.ADDRESS; objc: sINTEGER): sINTEGER;
- VAR uPtr: PtrUSERBLK;
- t: tTree;
- BEGIN
- t:= tree;
- IF t^[objc].obType = MagicAES.GPROGDEF THEN
- uPtr:= t^[objc].obSpec.address;
- RETURN uPtr^.obType; (* gemerkten Objekttyp liefern *)
- END;
- RETURN t^[objc].obType; (* Original-Objekttyp liefern *)
- END GetObtype;
-
- PROCEDURE GetObSpec (tree: SYSTEM.ADDRESS; objc: sINTEGER): SYSTEM.ADDRESS;
- VAR uPtr: PtrUSERBLK;
- t: tTree;
- BEGIN
- t:= tree;
- IF t^[objc].obType = MagicAES.GPROGDEF THEN
- uPtr:= t^[objc].obSpec.address; RETURN uPtr^.ubPara.address;
- END;
- RETURN t^[objc].obSpec.address;
- END GetObSpec;
-
- PROCEDURE GetPrivate (tree: SYSTEM.ADDRESS; objc: sINTEGER): SYSTEM.ADDRESS;
- VAR uPtr: PtrUSERBLK;
- t: tTree;
- BEGIN
- t:= tree;
- IF t^[objc].obType = MagicAES.GPROGDEF THEN
- uPtr:= t^[objc].obSpec.address; RETURN uPtr^.priv;
- END;
- RETURN NIL;
- END GetPrivate;
-
- VAR init : INTEGER;
-
- PROCEDURE InitMtXobjects();
- BEGIN
- IF init # 27895
- THEN
- pblkptr:= SYSTEM.ADR (pblk);
-
- stackA7:= SYSTEM.ADR (stack) + Stacksize; stackA3:= SYSTEM.ADR (stack);
-
- init := 27895
- END;
- END InitMtXobjects;
-
- BEGIN
- init := 0;
- InitMtXobjects;
- END mtXobjects.
-
-